<?php

namespace app\models\money;

use app\components\API;
use app\components\Fun;
use Yii;
use yii\base\Exception;
/**
 * This is the model class for table "{{%money_pay}}".
 *
 * @property int $id
 * @property string|null $order_on 支付订单号,在本表中有唯一性,和消费和充值记录对应的订单号一致
 * @property string|null $state 支付状态,'create'订单被创建,'PaymentSuccessful'支付成功,'PaymentFail'支付失败
 * @property int|null $time 创建时间
 * @property int|null $uid 用户id
 * @property int|null $money 变动的金额,单位是分,100表示1元;1表示1分
 * @property string|null $pay_type 支付类型
 * @property string|null $payplatform_order_on 支付平台的订单号
 * @property int|null $paytime 支付的时间
 * @property string|null $log 支付相关的日志
 */
class MoneyPay extends \yii\db\ActiveRecord
{

    const pay_type_weixin='weixin';
    const pay_type_zhifubao='zhifubao';

    //'create','PaymentSuccessful','PaymentFail'
    /**
     * 创建状态
     */
    const state_create='create';
    /**
     * 支付成功状态
     */
    const state_PaymentSuccessful='PaymentSuccessful';
    /**
     * 支付失败状态
     */
    const state_PaymentFail='PaymentFail';

    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return '{{%money_pay}}';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['state', 'pay_type', 'log'], 'string'],
            [['time', 'uid', 'money', 'paytime'], 'integer'],
            [['order_on', 'payplatform_order_on'], 'string', 'max' => 255],
            [['order_on'], 'unique'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'order_on' => 'Order On',
            'state' => 'State',
            'time' => 'Time',
            'uid' => 'Uid',
            'money' => 'Money',
            'pay_type' => 'Pay Type',
            'payplatform_order_on' => 'Payplatform Order On',
            'paytime' => 'Paytime',
            'log' => 'Log',
        ];
    }

    /**
     *表示外部充值
     */
    const DEL_cz = 'y';
    /**
     * 表示内部转账
     */
    const DEL_system = 's';
    /**
     * 表示提现
     */
    const DEL_Tixian='t';

    /**
     * 生成支付订单
     */
    private function genNo($uid) {
        $uid=$uid%1000000;
        return self::DEL_cz . date('Ymdhms') . mt_rand(1000, 9999).str_pad($uid,6,"0",STR_PAD_LEFT);
    }

    /**
     * 创建用于支付的订单
    */
    public static function createPayNo($uid,$pay_type,$money){
        if($pay_type!==self::pay_type_zhifubao&&$pay_type!==self::pay_type_weixin){
            API::echo_json(1,"支付类型错误,不支持".$pay_type);
        }
        $new=new self;
        $new->order_on=$new->genNo($uid);
        $new->state=self::state_create;
        $new->time=time();
        $new->uid=$uid;
        $new->money=$money*100;
        $new->pay_type=$pay_type;
        $new->payplatform_order_on='';
        $new->paytime=0;
        $new->log='';
        if($new->save()){
            return $new->order_on;
        }else{
            API::echo_json(1,"系统错误,请稍候");
            return false;
        }
    }

    /**
     * 验证成功,执行充值操作,如果操作成功返回true
     * $pay_type 支付平台类型 {'weixin','zhifubao'}
     * $out_trade_no 订单号
     * $trade_no 支付平台订单号
    */
    public static function NotifyPay($pay_type, $out_trade_no,$trade_no){
        $transaction = \Yii::$app->db->beginTransaction();
        try{
            // throw new \Exception('这里是错误原因');
            $one=self::find()->where([
                'order_on'=>$out_trade_no
            ])->one();
            if($one->state==self::state_PaymentSuccessful){
                $transaction->commit();
                return true;
            }
            $one->state=self::state_PaymentSuccessful;
            $one->pay_type=$pay_type;
            $one->paytime=time();
            $one->payplatform_order_on=$out_trade_no;
            $log=MoneyBalance::chongzhi($one->money,$one->uid);
            if(!$log){
                throw new \Exception('修改用户余额时错误');
            }
            $one->log=$log."\r\n";
            if($one->update()===false){
                throw new \Exception('修改订单状态错误');
            }
            $transaction->commit();
            return true;
        }catch (Exception $e){
            //获取抛出的错误
            $error = $e->getMessage();
            \app\models\Error::addmsg("事物错误,更新积分和记录标记的时候".$error.';out_trade_no:'.$out_trade_no);

            //操作回滚
            $transaction->rollBack();
            return false;
        }

    }








}
